<!--
 * @Author: your name
 * @Date: 2021-08-02 10:52:45
 * @LastEditTime: 2021-08-03 16:24:10
 * @Description: 
-->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 冒泡排序
    function bubbleSort(array) {
      const len = array.length
      let cnt = 0
      for (let i = 0; i < len - 1; i++) {
        const k = len - i - 1
        for (let j = 0; j < k; j++) {
          cnt++
          if (array[j] > array[j + 1]) {
            [array[j], array[j + 1]] = [array[j + 1], array[j]]
          }
        }
      }
      console.log(cnt)
      return array
    }


    // 两个循环次数觉得执行效率，所以可以从减少循环次数下手优化，记录最后一次交换的位置
    // 情况：1. 可能传入的数组已经是有序的； 2. 可能数组后面的已经是有序的
    function bubbleSort3(array) {
      var cnt = 0
      for (let end = array.length - 1; end > 0; end--) {
        // sortIndex的初始值在数组完全有序的时候有用，end初始值要适合外层for循环条件
        // 如果大于等于2并且数据完全有序将会死循环
        let sortIndex = 1
        for (let begin = 1; begin <= end; begin++) { // begin 和 begin - 1比较
          cnt++
          if (array[begin] < array[begin - 1]) {
            [array[begin], array[begin - 1]] = [array[begin - 1], array[begin]]
            sortIndex = begin
          }
        }
        end = sortIndex
      }
      console.log(cnt)
      return array
    }


    console.log(bubbleSort3([5, 1, 3, 2, 7, 8, 9]))
    console.log(bubbleSort3([10, 11, 12, 13, 14, 15]))
  </script>
</body>

</html>